Django 本身就已經有了強大的帳號機制,但是有時會因為專案的考量,API 需要使用其他的帳號驗證服務,例如有名的 Firebase authentication,那麼這個時候,Django REST framework 可不可以使用 Firebase 的帳號系統呢?
答案是可以的,透過 django-rest-framework-firebase 就可以做到,而且變動很少。
專案網址:https://github.com/wesleylima/django-rest-framework-firebase
poetry add djangorestframework-firebase
要使用 djangorestframework-firebase ,必須先去 firebase console 那邊建立專案,然後進入設定 > 服務帳戶裡取得 admin 的 credential json 或檔案。
接著把它填入 Django 專案的 settings 裡,如果是下載檔案的話,把檔案放到專案可以存取到的地方,然後填入以下設定
# settings
# 如果是取得檔案
FIREBASE_AUTH = {
'FIREBASE_ACCOUNT_KEY_FILE': 'path_to_your_credentials.json',
}
如果是用 credential json 的話,是這樣填寫:
FIREBASE_AUTH = {
'FIREBASE_CREDENTIALS': {
'type': "service_account",
'project_id': "",
'private_key_id': "",
'private_key': "",
'client_email': "",
'client_id': "",
'auth_uri': "https://accounts.google.com/o/oauth2/auth",
'token_uri': "https://accounts.google.com/o/oauth2/token",
'auth_provider_x509_cert_url': "https://www.googleapis.com/oauth2/v1/certs",
'client_x509_cert_url': ""
}
}
Firebase 的設定填寫完以後,就可以來填寫 REST framework 的設定了。
可以在 REST Framework 的設定裡指定 API 統一使用 FirebaseAuthentication
# settings
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_firebase.authentication.FirebaseAuthentication',
)
...
}
也可以在個別的 APIView 裡面指定。
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_firebase.authentication import FirebaseAuthentication
class ExampleView(APIView):
authentication_classes = [FirebaseAuthentication,] # 就是這裡!
permission_classes = [IsAuthenticated]
def get(self, request, format=None):
content = {
'username': request.user.username, # `django.contrib.auth.User` instance.
}
return Response(content)
上面設定填寫完以後,在呼叫 API 時,就會使用 Firebase admin SDK 去驗證使用者了。
我們來深入了解一下 django-rest-framework-firebase 內部的運作。
首先,要使用 Firebase SDK 登入,取得 Token。
在呼叫 API 時,把取得的 Token 帶入 Header :
$ curl -H "Authorization: JWT <your_firebase_token>" http://localhost:8000/api/example/
FirebaseAuthentication 類別裡,會先取得 Header 裡的 token,再使用 Firebase Admin SDK 來驗證這個 token。
驗證通過的話,會依據驗證結果裡的 uid / email 去資料庫裡找使用者,有找到的話就傳回使用者。如果沒有找到這個使用者,那麼會再看設定裡的 FIREBASE_CREATE_NEW_USER 變數,為真的時候,就會用 uid / email 來建立使用者。
透過 django-rest-framework-firebase 就可以改用 Firebase 當做主要的帳號驗證服務,真的是很方便。其實我從這個函式庫還學到,如果你的帳號驗證會依賴其他伺服器或服務時,也可以透過這個方式來處理。
大大您好,
想請問設定完以後要透過什麼 url 讓使用者進行登入呢?
我原本的想法是,這個套件取代了 Django 內建的 auth 去做使用者的登入登出等
所以一樣可以使用
urlpatterns = [
...
path('accounts/', include('django.contrib.auth.urls')),
...
]
讓使用者從 /login
登入,但嘗試以後發現不太對..
想請問您是怎麼實作的呢?
這個套件主要是給 django restframework 用的,django 登入的部份要另外找。
你可以參考這篇:https://www.geeksforgeeks.org/django-authentication-project-with-firebase/
我剛看了,這應該是你要的。
因為我是打算用 firebase 再轉 Microsoft Azure AD 做驗證,所以變得更複雜了(我有看過 Geeks 的那篇,但他是用帳號密碼)
不過還是謝謝你!我再來研究看看